<?php
class pCategoryAction extends pBaseAction {

    public function index(){
        $dao=new CategoryModel();
        $this->assign('allCategorys',$dao->getTree());
        $this->display();
    }

    public function edit(){
        $catid=$this->getId();
        if(false!==$catid){
            $dao=new CategoryModel();
            $rs=$dao->where("id={$catid}")->find();
            if(false!==$rs){
                $rs['pid'] = $dao->getPid($rs);
                $this->assign('rs',$rs);
                $this->assign('allCategorys',$dao->getTree());
                return $this->display();
            }
        }
        return $this->fail(L('module_edit_fail'),L('module_no_such_category'));
    }

    public function update(){
        $dao=new CategoryModel();
        $t=array_key_exists('t',$_POST) ? $_POST['t'] :'1';
        if('2'===$t){
            //move category
        }else{
            $rs = $dao->updateCategory();
            $this->simpleReturn($dao,$rs,sprintf(L('module_update_category_ok'),$rs['name']));
        }
    }

    public function add(){
        $dao = new CategoryModel();
        $this->assign('allCategorys',$dao->getTree());
        $this->display();
    }

    public function save(){
        $dao = new CategoryModel();
        $rs = $dao->addCategory();
        $this->simpleReturn($dao,$rs,sprintf(L('module_save_category_ok'),$rs['name']));
    }

    /**
     * 栏目授权
     */
    public function allocate(){/*{{{*/
        //@todo 有使用上一下、下一步，考虑表单的状态保留，需要从header中设置不保存这个表单状态
        $step = array_key_exists('step',$_GET) ? $_GET['step'] : ( array_key_exists('step',$_POST) ? $_POST['step']:'1');
        $prefix = C('db_prefix');
        if($step === '1'){     //第一步列出拥有pContent权限的用户
            $dao = new Model();
            //@todo 要排除掉admin_role的角色，此角色的用户对所有栏目均有操作权限
            $users = $dao->field('distinct u.id,u.account,u.realname')
                    ->table("{$prefix}user u,{$prefix}node n, {$prefix}access a")
                    ->where("a.parentNodeId=n.id and u.role=a.role and n.name='pContent'")
                    ->findAll();
            $this->assign('users', $users);
            $this->display('allocate1');
        }else if($step == '2'){     //列出栏目，查找用户已经有的授权信息
            $uid = $this->getId();   //TODO:没有去验证用户是否有权限,也没有去验证传入参数是否正确
            //查询用户信息
            $dao = new UserModel();
            $user = $dao->where("id={$uid}")->find();
            //查询用户的授权情况
            $allocate = $dao->field('category,allocate')->table("{$prefix}category_user")->where("userid={$uid}")->findAll();
            $this->assign('allocate', $allocate);
            //列出可用栏目---不列出跳转栏目
            $cates = $dao->field('name,id,ply')
                    ->where("jump='' and id>1")
                    ->table($prefix.'category')
                    ->order('lft')
                    ->findAll();
            $this->assign('cates', $cates);
            $this->assign('user',$user);
            $this->display('allocate2');
        }else if($step === '3'){
            if(array_key_exists('id',$_POST)){
                $uid = $_POST['uid'];
                $dao = new CategoryUserModel();
                $dao->startTrans();
                //@todo 此处涉及一个权限及时刷新的问题，暂时假定存在一个在线用户列表。在完成此操作后调用某一方法使刷新用户的SESSION缓存数据
                if( false === $dao->where("userid={$uid}")->delete() ){   //先删除用户旧的授权数据
                    $this->simpleReturn($dao,false);
                }
                /**
                @todo 暂时不考虑range的问题，即有该栏目的授权即可操作该栏目下的所有文章
                notice:栏目下不包含子孙栏目,仅指当前栏目
                $range = array();
                if(array_key_exists('range', $_POST)){
                    $range = $_POST['range'];
                }
                **/
                $sid = $_POST['id'];
                foreach($sid as $id){   //遍历选中的栏目
                    if( false === $dao->add( array('category'=>$id,'userid'=>$uid ))){
                        $dao->rollback();
                        $this->simpleReturn($dao,false);
                    }
                }
                $dao->commit();
                $this->simpleReturn($dao,true,L('category_allocate_success'));
            }
        }
    }/*}}}*/

}
